﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using SushiSOAPServices.Persistencia;
using SushiSOAPServices.Dominio;
using SushiSOAPServices.Exceptions;

namespace SushiSOAPServices
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Producto" en el código, en svc y en el archivo de configuración a la vez.
    public class Productos : IProductos
    {
        //ObjetosDAO
        private ProductoDAO productoDAO = null;
        private ProductoDAO ProductoDAO
        {
            get
            {
                if (productoDAO == null)
                    productoDAO = new ProductoDAO();
                return productoDAO;
            }
        }

        public int validarProductoEnPedidos(int idproducto)
        {
            return ProductoDAO.validarProductoEnPedidos(idproducto);
        }

        public Producto CrearProducto(Producto productoACrear)
        {
            Producto productoEncontrado = ProductoDAO.obtenerProductoPorNombre(productoACrear.Nombre);

            if (productoEncontrado != null)
            {
                ProductoException ex = new ProductoException { Message = "El producto " + productoACrear.Nombre + " ya se encuentra registrado." };
                throw new FaultException<ProductoException>(ex, ex.Message);
            }

            return ProductoDAO.Crear(productoACrear);
            
        }

        public Producto ObtenerProducto(int codigo)
        {
            return ProductoDAO.Obtener(codigo);
        }

        public Producto ModificarProducto(Producto productoAModificar)
        {
            Producto productoEncontrado = ProductoDAO.obtenerProductoPorNombre(productoAModificar.Nombre);

            if (productoEncontrado != null)
            {
                ProductoException ex = new ProductoException { Message = "El Nombre del producto " + productoAModificar.Nombre + " ya se encuentra registrado. Intente con otro nombre." };
                throw new FaultException<ProductoException>(ex, ex.Message);
            }

            return ProductoDAO.Modificar(productoAModificar);
        }

        public void EliminarProducto(int codigo)
        {
            Producto productoEncontrado = ProductoDAO.Obtener(codigo);

            int enPedido = ProductoDAO.validarProductoEnPedidos(productoEncontrado.IdProducto);

            if (enPedido > 0)
            {
                ProductoException ex = new ProductoException { Message = "No se puede dar de baja el producto " + productoEncontrado.Nombre + " porque se encuentra en un pedido pendiente" };
                throw new FaultException<ProductoException>(ex, ex.Message);
            }

            ProductoDAO.Eliminar(productoEncontrado);
        }

        public List<Producto> ListarProducto()
        {
            return (List<Producto>)ProductoDAO.ListarTodos();
        }
    }
}
